      !< @file
      !> @brief Rotina de clusterização baseada apenas no valor da velocidade de cada nó.
      !> 
      !> Conta com a definição do número de classes pelo usuário
      subroutine clusterizainterat(c,nx,nz)
      implicit none

      double precision:: c(nx,nz)!< [in,out] grid de valores para a clusterização, no caso velocidade nos nós do problema inverso
      integer :: nx !< [in] dimensão do grid direção x
      integer :: nz !< [in] dimensão do grid direção z
      integer :: i,j
      integer :: ierr !< Indica se houve erro na alocação de memória

      integer :: Nclasses !< Número de classes para a clusterização
      integer :: kncl !< Contador do número de classes.
      integer :: clmenord!< A classe que tem a menor distância em relação ao valor analisado
      double precision :: dmenor!< menor distância
      double precision:: difclasse!< quadrado da norma do vetor diferença entre os vetores de classes atual e antigo
      double precision, dimension(:), allocatable:: Classes!< vetor de classes atual
      double precision, dimension(:), allocatable:: Classesold!< vetor de classes antigo
      integer, dimension(:), allocatable:: freqclasses!< número de casos classificados em cada classe

      real, dimension(:,:), allocatable:: creal !< variável auxiliar para plotar com SU o novo modelo
      character*5 :: chn1,chn2,chncl !< variáveis auxiliares para conversão de nx, nz e nclasses em character
      character*1 :: fim='n' !< determina o fim do processo de clusterização

      


      allocate(creal(nx,nz))   
      do j=1,nz
	  do i=1,nx
	      creal(i,j) = c(i,j) ! truncando c como real
	  enddo
      enddo

      call system('rm cluster0.bin')
      open(1,file='cluster0.bin',status="new",form="unformatted",access="direct",recl=4*Nx*Nz)
      write(1,rec=1)(((creal(i,j)),j=1,Nz),i=1,Nx)
      close(1) 

      if(nz.lt.10)then
	  write(chn1,'(i1)')nz
      elseif(nz.lt.100)then
	  write(chn1,'(i2)')nz
      elseif(nz.lt.1000)then
	  write(chn1,'(i3)')nz
      elseif(nz.lt.10000)then
	  write(chn1,'(i4)')nz
      elseif(nz.lt.100000)then
	  write(chn1,'(i5)')nz
      endif


      if(nx.lt.10)then
	  write(chn2,'(i1)')nx
      elseif(nx.lt.100)then
	  write(chn2,'(i2)')nx
      elseif(nx.lt.1000)then
	  write(chn2,'(i3)')nx
      elseif(nx.lt.10000)then
	  write(chn2,'(i4)')nx
      elseif(nx.lt.100000)then
	  write(chn2,'(i5)')nx
      endif

      write(*,*)'ximage <cluster0.bin n1='//chn1//' n2='//chn2//' width=6 height=6 wbox=400 hbox=400 verbose=0&'
      call system('ximage <cluster0.bin n1='//chn1//' n2='//chn2//' width=6 height=6 wbox=400 hbox=400 verbose=0&')



      do

	  write(*,*)'Número de classes para a clusterização'
	  read(*,*)Nclasses



	  allocate(Classes(Nclasses),stat=ierr)
	  allocate(Classesold(Nclasses),stat=ierr)
	  allocate(freqClasses(Nclasses),stat=ierr)
	
	  do kncl=1,Nclasses !<inicialização dos valores das classes, poderia ser feito aleatoriamente.
	      Classesold(kncl) = c(nx/2,nz/Nclasses*(kncl-1)+1)
	      Classes(kncl) =0.0
	      freqClasses(kncl) =0
	  enddo

	  difclasse=1000.d0

	  do

	      write(*,*)'classes:',(classesold(kncl),kncl=1,Nclasses)
	      do j=1,nz
		  do i=1,nx
		      dmenor = sqrt((c(i,j)-Classesold(1))**2)
		      clmenord = 1
		      do kncl = 2,Nclasses
			  if(sqrt((c(i,j)-Classesold(kncl))**2).lt.dmenor)then
			    dmenor = sqrt((c(i,j)-Classesold(kncl))**2)
			    clmenord = kncl
			  endif
		      enddo !<fim do loop nas classes.
		      Classes(clmenord) = Classes(clmenord) + c(i,j)
		      freqClasses(clmenord) = freqClasses(clmenord) +1
		  enddo
	      enddo !<fim do loop nos nós.

	      do kncl = 1,Nclasses
		  Classes(kncl) = Classes(kncl)/ dfloat(freqClasses(kncl))
	      enddo

	      difclasse = 0.0d0
	      do kncl = 1,Nclasses
		  difClasse = difclasse+ sqrt((Classes(kncl) - Classesold(kncl))**2)
	      enddo 

	      if(difclasse.lt. 10.0d0) exit  !< condição para parar a s iterações da clusterização   

	      do kncl = 1,Nclasses
		  Classesold(kncl) = Classes(kncl)
		  Classes(kncl) =0.0
		  freqClasses(kncl) =0
	      enddo
	  enddo!< fim da clusterização


	  do j=1,nz !< atribui o valor das classes aos nós da matriz provisória.
	      do i=1,nx
		  dmenor = sqrt((c(i,j)-Classes(1))**2)
		  clmenord = 1
		  do kncl = 2,Nclasses
		      if(sqrt((c(i,j)-Classes(kncl))**2).lt.dmenor)then
			dmenor = sqrt((c(i,j)-Classes(kncl))**2)
			clmenord = kncl
		      endif
		  enddo
! 		  creal(i,j) = Classes(clmenord) 
		  creal(i,j) = (Classes(clmenord) +c(i,j))/2.0d0
	      enddo
	  enddo

	  !< plota matriz provisória
	  call system('rm cluster.bin')
	  open(1,file='cluster.bin',status="unknown",form="unformatted",access="direct",recl=4*Nx*Nz) !< plota matriz provisória
	  write(1,rec=1)(((creal(i,j)),j=1,Nz),i=1,Nx)
	  close(1)

 
	  call system('ximage <cluster.bin n1='//chn1//' n2='//chn2//' width=6 height=6 wbox=400 hbox=400 verbose=0&')

	  write(*,*)'fim da clusterizacao, classes:',(classes(kncl),kncl=1,Nclasses)
	  write(*,*)'Número de classes adequado?  (s ou n)'
	  read(*,*)fim
	  
	  if (fim.eq.'s')then
	      do j=1,nz 
		  do i=1,nx
		      c(i,j)=creal(i,j)
		  enddo
	      enddo

	      exit
	  endif



	  deallocate(Classes)
	  deallocate(Classesold)      
	  deallocate(freqclasses) 

	  

      enddo !< fim do loop até que fim=s

      deallocate(creal)   
      return

      end subroutine clusterizainterat

